#include <GL/glut.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

#define MAX_POINTS 20

typedef struct {
   float x;
   float y;
   float radio;
   float color[3];
}Punto;

void inicializa(void);
void dibuja(void);
void tecladoEspecial(int key, int cx, int cy);
void teclado(unsigned char key, int cx, int cy);
void raton(int boton, int estado, int cx, int cy);

int numPuntos;
float colorActual[3];
float size;
Punto puntos[MAX_POINTS];

int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(100, 150);
    glutCreateWindow("Interaccion");
    inicializa();
    
    glutDisplayFunc(dibuja);
    glutSpecialFunc(tecladoEspecial);
    glutKeyboardFunc(teclado);
    glutMouseFunc(raton);
    
    glutMainLoop();
    return 0;
}

void inicializa() {
    glClearColor(0.0, 0.0, 0.0, 1.0);
    
    //Ponemos el anialias a lo mas que da
    glEnable(GL_LINE_SMOOTH);
    glHint(GL_LINE_SMOOTH, GL_NICEST);
    glEnable(GL_POINT_SMOOTH);
    glHint(GL_POINT_SMOOTH, GL_NICEST);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 640.0, 0.0, 480.0);
    
    size = 2.0;
    glPointSize(size);
    
    numPuntos = 0;
    colorActual[0] = 1.0;
    colorActual[1] = 0.0;
    colorActual[2] = 0.0;
}

void dibuja(void) {
	int i;
    glClear(GL_COLOR_BUFFER_BIT);          
    
    glColor3f(1.0, 1.0, 1.0);
    glBegin(GL_LINE_STRIP);
    for(i = 0; i < numPuntos; i++) {
    	glVertex2f(puntos[i].x, puntos[i].y);
	}
    glEnd();
    
    glPointSize(size);
    glBegin(GL_POINTS);
    for(i = 0; i < numPuntos; i++) {
    	glColor3fv(puntos[i].color);
    	glVertex2f(puntos[i].x, puntos[i].y);
	}
    glEnd();
    
    glFlush();
}

void tecladoEspecial (int key, int cx, int cy) {
	float range[2];
	glGetFloatv(GL_POINT_SIZE_RANGE, range);
	printf("range[0] = %g\nrange[1] = %g\n", range[0], range[1]);
	
	switch(key) {
		case GLUT_KEY_PAGE_UP:
			if(size < range[1]) size += 1.0;
		break;
		
		case GLUT_KEY_PAGE_DOWN:
			if (size > 1.0) size -= 1.0;
		break;
	}
	printf("size = %g\n\n", size);
	
	glutPostRedisplay();
}

void teclado (unsigned char key, int cx, int cy) {
	switch(key) {
		
		case 27:
			exit(0);
		break;
		
		case 'b':
		case 'B':
			colorActual[0] = 0.0;
			colorActual[1] = 0.0;
			colorActual[2] = 1.0;
		break;
		
		case 'r':
		case 'R':
			colorActual[0] = 1.0;
			colorActual[1] = 0.0;
			colorActual[2] = 0.0;
		break;
		
		case 'g':
		case 'G':
			colorActual[0] = 0.0;
			colorActual[1] = 1.0;
			colorActual[2] = 0.0;
		break;
		
		case 'y':
		case 'Y':
			colorActual[0] = 1.0;
			colorActual[1] = 1.0;
			colorActual[2] = 0.0;
		break;
		
		case 8:
			if (numPuntos > 0) numPuntos--;
		break;
	}
	
	glutPostRedisplay();
}

void raton (int boton, int estado, int cx, int cy) {
	if (boton == GLUT_LEFT_BUTTON && estado == GLUT_DOWN) {
		if (numPuntos < MAX_POINTS) {
			puntos[numPuntos].x = cx;
			puntos[numPuntos].y = 480 - cy;
		
			puntos[numPuntos].color[0] = colorActual[0];
			puntos[numPuntos].color[1] = colorActual[1];
			puntos[numPuntos].color[2] = colorActual[2];
		
			numPuntos++;
		}
	}
	
	glutPostRedisplay();
}
